<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <script>
    // Reflect  反射机制
    // Reflect 为了操作对象 提供了api
    var name = "李思"
    var obj = {
      name: "张三",
      shengao: 188,
      run: function (x, y) {
        console.log(this.name, x, y)
      }
    }
    obj.run.apply(window, [8, 9])
    // 1 Reflect.apply()  //改变this指向
    Reflect.apply(obj.run, window, [8, 9])
    // 
    Object.defineProperty(obj, "age", {
      value: 15,
      configurable: true,
      enumerable: true,
      writable: true
    })
    //  2.Reflect.defineProperty() //设置对象的属性
    Reflect.defineProperty(obj, "sex", {
      value: "男",
      configurable: false,
      enumerable: true,
      writable: true
    })
    console.log(obj)
    //3.Reflect.construct()静态Reflect.construct()方法的作用类似于new运算符
    var date = Reflect.construct(Date, ['2020-12-12']);
    console.log(date)
    //4.Reflect.delete​Property() 删除对象的属性
    var flag = Reflect.deleteProperty(obj, 'shengao')
    console.log(flag)
    console.log(obj)
    //5.Reflect.get​OwnProperty​Descriptor()
    // 都是返回指定对象的原型（即，内部的 [[Prototype]] 属性的值）。
    var desObj = Reflect.getOwnPropertyDescriptor(obj, "sex");
    if (desObj.configurable) {
      alert("可以删除")
    }
    //6.Reflect.has() 用于检查一个对象是否拥有某个属性， 相当于in 操作符
    console.log(Reflect.has(obj, "run"))
    // 7.Reflect.preventExtensions()  方法阻止新属性添加到对象
    // Reflect.preventExtensions(obj)
    //  8.Reflect.isExtensible() 判断一个对象是否可扩展 （即是否能够添加新的属性），
    var fa = Reflect.isExtensible(obj)
    console.log(fa)
    // 9.Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组
    // Object.keys()
    function Car(name) {
      this.name = name;
    }
    Car.prototype.age = 888;
    var car1 = new Car("豪车")
    console.log(Reflect.ownKeys(car1))
    console.log(car1.age)
    // 10.Reflect.set 方法允许你在对象上设置属性。
    Reflect.set(obj, "tizhong", "188");
    console.log(obj)
    // 11 Reflect.get()  获取对象的属性
    console.log(Reflect.get(obj, "name"))
  </script>
</body>

</html>